package cn.iocoder.yudao.module.contract.service.order;

import java.math.BigDecimal;
import java.util.*;
import javax.validation.*;

import cn.iocoder.yudao.module.contract.controller.admin.exportContract.vo.ExportOrderPageReqVO;
import cn.iocoder.yudao.module.contract.controller.admin.order.vo.*;
import cn.iocoder.yudao.module.contract.dal.dataobject.frameworkAgreement.FrameworkAgreementDO;
import cn.iocoder.yudao.module.contract.dal.dataobject.order.OrderDO;
import cn.iocoder.yudao.module.contract.dal.dataobject.order.OrderDetailsDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;

/**
 * 订单 Service 接口
 *
 * @author 芋道源码
 */
public interface OrderService extends IService<OrderDO> {

    /**
     * 创建订单
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createOrder(@Valid OrderSaveReqVO createReqVO);

    /**
     * 更新订单
     *
     * @param updateReqVO 更新信息
     */
    void updateOrder(@Valid OrderSaveReqVO updateReqVO);

    /**
     * 删除订单
     *
     * @param id 编号
     */
    void deleteOrder(Long id);

    /**
     * 获得订单
     *
     * @param id 编号
     * @return 订单
     */
    OrderDO getOrder(Long id);

    /**
     * 获得订单分页
     *
     * @param pageReqVO 分页查询
     * @return 订单分页
     */
    PageResult<OrderDO> getOrderPage(OrderPageReqVO pageReqVO);

    // ==================== 子表（订单明细） ====================

    /**
     * 获得订单明细列表
     *
     * @param orderId 订单id
     * @return 订单明细列表
     */
    List<OrderDetailsDO> getOrderDetailsListByOrderId(Long orderId);

    IPage<OrderDetailsRespVO> getOrderDetailsPage(OrderDetailsPageReqVO pageReqVO);

    /**
     * 获得出口就订单分页
     *
     * @param pageReqVO 分页查询
     * @return 订单分页
     */
    PageResult<OrderDO> getExportOrderPage(ExportOrderPageReqVO pageReqVO);

    /**
     * 获取未发货状态的合同订单
     *
     * @return
     */
    List<OrderDO> listUnShippingOrders();

    /**
     * 更新订单发货状态为已发货，最早发货时间，订单完成状态，完成状态解释
     * @param vbeln
     * @param latestShipmentDate
     * @param completeState
     * @param completeStateExplain
     * @return
     */
    boolean updateOrderShippingStatus(String vbeln,String latestShipmentDate,String completeState,String completeStateExplain);

    /**
     * 根据订单Id获取订单金额
     * @param orderId
     * @return
     */
    List<OrderDetailsDO> getOrderMoneyById(long orderId);

}